dhcpv6-ia: reconfigure message length bug fix master
authorPaul Donald <[email protected]>
Thu, 18 Dec 2025 04:01:14 +0000 (05:01 +0100)
committerÁlvaro Fernández Rojas <[email protected]>
Thu, 18 Dec 2025 17:06:12 +0000 (18:06 +0100)
follow-up to ae16476bcad27049f82e3043e88958405096c4bb

Now, the lengths are actual encoded size, resulting in:

DHCPv6
    Message type: Reconfigure (10)
    Transaction ID: 0x000000
    Server Identifier
        Option: Server Identifier (2)
        Length: 10
        DUID: 00030001xx
        DUID Type: link-layer address (3)
        Hardware type: Ethernet (1)
        Link-layer address: xx
        Link-layer address (Ethernet): xx
    Client Identifier
        Option: Client Identifier (1)
        Length: 10
        DUID: 00030001xx
        DUID Type: link-layer address (3)
        Hardware type: Ethernet (1)
        Link-layer address: xx
        Link-layer address (Ethernet): xx
    Reconfigure Message
        Option: Reconfigure Message (19)
        Length: 1
        Reconfigure message type: Renew (5)

The previous calculation would count a full DUID buffer
length, but the buffer size was not adjusted based on
the used size, resulting in DHCPv6 RECONF messages like:

DHCPv6
    Message type: Reconfigure (10)
    Transaction ID: 0x000000
    Server Identifier
        Option: Server Identifier (2)
        Length: 10
        DUID: 0003XXX
        DUID Type: link-layer address (3)
        Hardware type: Ethernet (1)
        Link-layer address: XXX
        Link-layer address (Ethernet): XXX
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    Client Identifier
        Option: Client Identifier (1)
        Length: 18
        DUID: 0004xxx
        DUID Type: Universally Unique IDentifier (UUID) (4)
        UUID: xxx
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    DHCP option 0
        Option: Unknown (0)
        Length: 0
    Reconfigure Message
        Option: Reconfigure Message (19)
        Length: 1
        Reconfigure message type: Renew (5)

Signed-off-by: Paul Donald <[email protected]>
Link: https://github.com/openwrt/odhcpd/pull/361
Signed-off-by: Álvaro Fernández Rojas <[email protected]>
src/dhcpv6-ia.c

index 5af952d1bcfad770fe1e597ac84183d7559a3ed8..d1881ee5cd6848254702cccaf9b68e926a1d02bd 100644 (file)
@@ -215,10 +215,14 @@ static int send_reconf(struct dhcpv6_lease *assign)
 
        memcpy(clientid.data, assign->duid, assign->duid_len);
 
+       size_t serverid_len, clientid_len;
+       serverid_len = sizeof(serverid.code) + sizeof(serverid.len) + ntohs(serverid.len);
+       clientid_len = sizeof(clientid.code) + sizeof(clientid.len) + ntohs(clientid.len);
+
        struct iovec iov[IOV_TOTAL] = {
                [IOV_HDR] = { &hdr, sizeof(hdr) },
-               [IOV_SERVERID] = { &serverid, sizeof(serverid) },
-               [IOV_CLIENTID] = { &clientid, sizeof(clientid) },
+               [IOV_SERVERID] = { &serverid, serverid_len },
+               [IOV_CLIENTID] = { &clientid, clientid_len },
                [IOV_MESSAGE] = { &message, sizeof(message) },
                [IOV_AUTH] = { &auth, sizeof(auth) },
        };